home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / For your think c folder / VA Kit ƒ / VAExplode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-09  |  3.3 KB  |  158 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: VAExplode.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Wednesday, September 9, 1992, 21:41
  6.      Created: Saturday, February 11, 1989, 0:53
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. #include "VA.h"
  12. #include "VAInternal.h"
  13.  
  14. #define    NUMEXPLOSIONS  30
  15. #define    RESEXPLOSIONS    4
  16.  
  17. int            numexploding;
  18. int            **exploder;
  19. int            **exploffset;
  20. int            *explx;
  21. int            *exply;
  22. int            *explcolor;
  23.  
  24. int        *Boom[RESEXPLOSIONS];
  25. int        *Bang[RESEXPLOSIONS];
  26.  
  27. Ptr        MaxBaseAddr,MinBaseAddr;
  28.  
  29. void    VALoadExplosions()
  30. {
  31.                 int        n;
  32.     register    int        m,i;
  33.     register    long    delta;
  34.     register    int        *p;
  35.     register    long    *q;
  36.                 Handle    Kaboom;
  37.     
  38.     MinBaseAddr=VA.base+VA.frame.top*(long)VA.row;
  39.     MaxBaseAddr=VA.base+VA.frame.bottom*(long)VA.row;
  40.     
  41.     for(n=0;n<RESEXPLOSIONS;n++)
  42.     {    Kaboom=GetResource('GNRL',n+1000);
  43.         HLock(Kaboom);
  44.         Bang[n]=(int *)NewPtr(GetHandleSize(Kaboom));
  45.         Boom[n]=(int *)*Kaboom;
  46.  
  47.         p=Boom[n];
  48.         q=(long *)Bang[n];
  49.  
  50.         do
  51.         {    m=*p++;
  52.             q=(long *)(((Ptr) q)+2);
  53.             for(i=0;i<m;i++)
  54.             {    delta = *p++;                        /*    X coord    */
  55.                 delta+= *p++ * (long)VA.row;        /*    Y coord    */
  56.                 *q++=delta;
  57.             }
  58.         } while(m!=0);
  59.     }
  60.     exploder    =(void *) NewPtr(sizeof(int *)    * NUMEXPLOSIONS);
  61.     exploffset    =(void *) NewPtr(sizeof(int *)    * NUMEXPLOSIONS);
  62.     explx        =(void *) NewPtr(sizeof(int)    * NUMEXPLOSIONS);
  63.     exply        =(void *) NewPtr(sizeof(int)    * NUMEXPLOSIONS);
  64.     explcolor    =(void *) NewPtr(sizeof(int)    * NUMEXPLOSIONS);
  65.     numexploding=0;
  66.  
  67. }
  68.  
  69. void    VAExplosion(x,y,size,color)
  70. int        x,y,size,color;
  71. {
  72.     register    int        n;
  73.     
  74.     if(numexploding<NUMEXPLOSIONS)
  75.     {    n=numexploding++;
  76.         exploder[n]        =Boom[size];
  77.         exploffset[n]    =Bang[size];
  78.         explx[n]        =x;
  79.         exply[n]        =y;
  80.         explcolor[n]    =color;
  81.     }
  82. }
  83.  
  84. void    VAInsertExplosions()
  85. {
  86.     register    int        n,m,x,y,color;
  87.     register    long    *pixp;
  88.     register    int        *coordp,*offs;
  89.                 int        *colp;
  90.                 int        *numpix;
  91.  
  92.     numpix=VA.numpix+VA.curbuffer;
  93.  
  94.     for(n=0;n<numexploding;n++)
  95.     {    x=explx[n];
  96.         y=exply[n];
  97.         color=explcolor[n];
  98.         coordp=exploder[n];
  99.         offs=exploffset[n];
  100.         m=*coordp++;
  101.  
  102.         if(*numpix+m < MAXSAVEDPIX)
  103.         {    colp=VA.pixcolors[VA.curbuffer]+*numpix;
  104.             pixp=VA.pix[VA.curbuffer]+*numpix;
  105.         asm    {
  106.             addq.l    #2,offs            ;    Move to next offset
  107.             move.w    VA.row,D0        ;    Calculate base address
  108.             mulu.w    y,D0
  109.             move.l    D0,A0
  110.             add.w    x,A0
  111.             add.l    VA.base,A0
  112.  
  113.             subq.l    #1,m
  114.         @loop
  115.             move.w    (coordp)+,D0    ;    X offset
  116.             addq.l    #2,coordp        ;    Move past Y offset
  117.             add.w    x,D0            ;    add center x
  118.             cmp.w    VA.frame.left,D0    ;    too much left?
  119.             blt.s    @nopixel
  120.             cmp.w    VA.frame.right,D0    ;    too much right?
  121.             bge.s    @nopixel
  122.  
  123.             move.l    A0,A1            ;    Copy explosion base
  124.             add.l    (offs),A1        ;    read offset
  125.             cmp.l    MinBaseAddr,A1    ;    above screen?
  126.             bcs.s    @nopixel        ;    yes
  127.             cmp.l    MaxBaseAddr,A1    ;    under screen?
  128.             bcc.s    @nopixel        ;    yes
  129.  
  130.             move.l    A1,(pixp)+        ;    pixel is ok.
  131.             move.l    colp,A1            ;    queue color
  132.             move.w    color,(A1)
  133.             addq.l    #2,colp            ;    next color
  134.         @nopixel
  135.             addq.l    #4,offs            ;    next offset
  136.             dbra    m,@loop
  137.             }
  138.             *numpix+=    pixp-(VA.pix[VA.curbuffer]+*numpix);
  139.         }
  140.         else
  141.         {    offs+= 1+2*m;
  142.             coordp+=2*m;
  143.         }
  144.  
  145.         exploder[n]=coordp;
  146.         exploffset[n]=offs;
  147.         if(*coordp==0)
  148.         {    /*    Remove from queue    */
  149.             numexploding--;
  150.             explx[n]        =explx[numexploding];
  151.             exply[n]        =exply[numexploding];
  152.             exploder[n]        =exploder[numexploding];
  153.             exploffset[n]    =exploffset[numexploding];
  154.             explcolor[n]    =explcolor[numexploding];
  155.             n--;
  156.         }
  157.     }
  158. }